package com.qf.openapi.web.master.controller;

import com.qf.openapi.web.master.entity.User;
import com.qf.openapi.web.master.ex.UserException;
import com.qf.openapi.web.master.service.UserService;
import com.qf.openapi.web.master.vo.ResultVo;
import com.qf.openapi.web.master.vo.UserRegistVo;
import com.qf.openapi.web.master.vo.UserUpdateVo;
import com.qf.openapi.web.master.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/user")
@Slf4j  // 引入日志对象
public class UserController {

    @Autowired
    UserService userService;

    /**
     * 根据用户id查询用户，
     *
     * @param id
     * @return 返回用户的json
     */
    @GetMapping("/get/{id}")
    public User getUser(@PathVariable("id") Integer id) {
        return userService.getUser(id);
    }


    /**
     * 用户登录接口
     *
     * @param username
     * @param password
     * @param captchar
     * @param session
     * @return 通用json数据
     */
    @PostMapping("/login")
    public ResultVo login(String username, String password, String captchar, HttpSession session) {
        //0. 打印日志，把该web接口收到的参数打印到日志中
        log.debug("接口入参为:username={},password={},captchar={}", username, password, captchar);

        //1. 校验验证码是否正确
        final String sessionCaptchar = (String) session.getAttribute("captcha");

        if (sessionCaptchar != null) {
            if (!sessionCaptchar.equals(captchar)) {
                // 验证码错误，直接返回错误信息

//                final ResultVo resultVo = new ResultVo(-1, "验证码错误");
                return ResultVo.error("验证码错误");
            }
        } else {
            // 如果session中没有对应的 验证码，也返回登录失败
//            final ResultVo resultVo = new ResultVo(-1, "服务器异常");
            return ResultVo.error("服务器异常");
        }

        //2. 查询数据库验证用户名和密码是否匹配
        // 如何设计service层的方法
        // （1） 要把处理业务逻辑所需要的参数都传给该方法
        //  (2) 返回值设计要满足 web接口返回json数据的需求
        User user = userService.login(username, password);

        //3. 根据user是否为null判断登录状态并返回json
        if (user == null) {
            // 用户名密码错误导致的登录失败
//            return new ResultVo(-1,"用户名密码错误");
            return ResultVo.error("用户名密码错误");
        } else {
            // 登录成功
            final ResultVo vo = ResultVo.ok();
            session.setAttribute("log", "login");
            vo.put("data", user);
            return vo;
        }

    }

    @PostMapping("/regist")
    public ResultVo regist(UserRegistVo userRegistVo, HttpSession session) throws Exception {
        //0.打日志
        log.debug("入参，userRegistVo={}", userRegistVo);
        //1.校验验证码是否正确

        String sessionCaptcha = (String) session.getAttribute("captcha");
        if (sessionCaptcha == null) {
            return ResultVo.error("服务器端异常，请刷新页面重试");
        }
        if (!sessionCaptcha.equals(userRegistVo.getCaptchar())) {
            return ResultVo.error("验证码输入错误");
        }

        //2.验证码正确，处理用户注册的业务逻辑
        userService.registUser(userRegistVo);

        //3.如果userService.registUser方法运行时没有抛出异常，则代表注册成功，返回响应的json
        return ResultVo.ok();
    }

    /**
     * 分页查询所有用户数据
     *
     * @param page  当前页号
     * @param limit 页大小
     * @return
     */
    @GetMapping("/getall")
    public ResultVo getAll(Integer page, Integer limit) {
        int start = (page - 1) * limit;
        List<User> users = userService.getAllUser(start, limit);
        int count = userService.getAllCount();
        System.out.println(users);
        final ResultVo ok = ResultVo.ok();
        ok.put("code", 0);
        ok.put("msg", "ok");
        ok.put("count", count);
        ok.put("data", users);
        return ok;
    }

    @RequestMapping("/add")
    public ResultVo add(UserVo userVo, HttpSession session) throws Exception {
        //0.打日志
        log.debug("入参，userVo={}", userVo);
        userService.addUser(userVo);
        return ResultVo.ok(200, "添加成功");
    }
    @RequestMapping("/update")
    public ResultVo update(UserUpdateVo userUpdateVo){
        //0.打日志
        log.debug("入参，userUpdateVo={}", userUpdateVo);
        userService.updateUser(userUpdateVo);
        return ResultVo.ok(200,"添加成功");
    }
    @RequestMapping("/del")
    public ResultVo delUser(String[] ids){
        //0.打日志
        log.debug("入参，ids={}", ids);
        userService.delUser(ids);
        return ResultVo.ok();
    }
}
